﻿using Entity;
using Quartz; 
using ServiceCore.Tool.Dapper;
using ServiceCore.Tool.ES;
using ServiceCore.Tool.Mqtt;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
using ServiceCore.Tool.AliFace;
using ServiceCore.Tool.JD_Pay;

namespace ServiceCore.Tool.Quartz
{
    public class check_aliface : IJob
    {
        private readonly IDapper_Helper _db;
        private readonly IEs_Log_Helper _es;
        private readonly IFacePay _face;
        public check_aliface(IDapper_Helper Db, IEs_Log_Helper ES, IFacePay Face)
        {
            _db = Db;
            _es = ES;
            _face = Face;
        }
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
            {
                try
                {
                    DateTime edt = DateTime.Now;
                    DateTime sdt = edt.AddHours(-2);
                    string sql = "select t.MchId,t.BaseUserId from  " +
                        " (select MchId,BaseUserId, count(*) as order_count from [order] a where CreateOn>=@sdt and CreateOn<=@edt and o_state = 2 and Fee_typeId = '103'" +
                        " group by MchId,BaseUserId) t" +
                        " left join mch_settlement b on t.mchid = b.mchid" +
                        " where b.mchid is null" +
                        " order by order_count desc";
                    var new_IC2_mch = _db.Get_rk_List<check_aliface_item>(sql, new { sdt, edt }).ToList();
                    if (new_IC2_mch.Count > 0)
                    {
                        new_IC2_mch = new_IC2_mch.Where(s => s.BaseUserId != "1421" && s.BaseUserId != "rk_test" && s.BaseUserId != "0" && s.BaseUserId != "RK").ToList();
                    }
                    _es.Add_Log($"获取到未入驻机器项{new_IC2_mch.Count}项", "check_aliface");
                    List<OLDJdmerchantBase> jdinfo = _db.Get_rk47_List<OLDJdmerchantBase>("select * from JdmerchantBase where baseuserid in @baseuserids", new { baseuserids = new_IC2_mch.Select(s => s.BaseUserId).Distinct().ToArray() }).ToList();
                    int add_success = 0;
                    int sub_success = 0;
                    int sub_error = 0;
                    foreach (var item in new_IC2_mch)
                    {
                        var mchitem = _db.Get_rk_List<mch_settlement>("select * from mch_settlement where mchid=@mchid", new { mchid = item.mchid }).FirstOrDefault();
                        if (mchitem == null)
                        {
                            mch_settlement mchinfo = new mch_settlement();
                            mchinfo.mchid = item.mchid;
                            mchinfo.addtime = DateTime.Now;
                            mchinfo.baseuserid = item.BaseUserId;
                            try
                            {
                                int ref_provice = 0;
                                int ref_city = 0;
                                int ref_area = 0;
                                string address = "";
                                get_address(jdinfo.Where(s => s.baseuserid == item.BaseUserId).FirstOrDefault(), ref ref_provice, ref ref_city, ref ref_area, ref address);
                                mchinfo.province_code = ref_provice;
                                mchinfo.city_code = ref_city;
                                mchinfo.area_code = ref_area;
                                mchinfo.machine_address = address;
                                mchinfo.is_sub = false;
                            }
                            catch (Exception ex)
                            {
                                mchinfo.sub_result = ex.ToString();
                            }
                            add_success += _db.do_rk_Execute(_db.AddBySqlStr<mch_settlement>(), mchinfo);
                            var sub_model = new sub_mch_settlement()
                            {
                                terminal_id = item.mchid,
                                address = new delivery_address_model()
                                {
                                    province_code = mchinfo.province_code.Value,
                                    city_code = mchinfo.city_code.Value,
                                    area_code = mchinfo.area_code.Value,
                                    machine_address = mchinfo.machine_address
                                },
                                scene = new scene_model
                                {
                                    level_1 = "COMMUNITY",
                                    level_2 = "001"
                                }
                            };
                            var ali_result = _face.Mch_Settlement(sub_model);
                            if (ali_result.data.Code == "10000")
                            {
                                sub_success += _db.do_rk_Execute("update mch_settlement set ali_terminal_id=@ali_terminal_id,is_sub=@is_sub,sub_params=@sub_params,sub_result=@sub_result where mchid=@mchid",
                                    new { ali_terminal_id = ali_result.data.AlipayTerminalId, mchid = item.mchid, is_sub = true, sub_params = Newtonsoft.Json.JsonConvert.SerializeObject(sub_model), sub_result = $"{ali_result.data.Msg},{ali_result.data.SubMsg}" });

                            }
                            else
                            {
                                sub_error += _db.do_rk_Execute("update mch_settlement set is_sub=@is_sub,sub_params=@sub_params,sub_result=@sub_result where mchid=@mchid",
                                     new { mchid = item.mchid, is_sub = false, sub_params = Newtonsoft.Json.JsonConvert.SerializeObject(sub_model), sub_result = $"{ali_result.data.Msg},{ali_result.data.SubMsg}" });
                            }
                        }
                    }
                    _es.Add_Log($"处理完成,添加成功{add_success}项,入驻成功{sub_success}项,入驻失败{sub_error}项", "check_aliface");
                }
                catch (Exception ex)
                {
                    _es.Add_Log($"处理异常{ex.ToString()}", "check_aliface");
                }
            });
        }
        private void get_address(OLDJdmerchantBase jd_item, ref int pro, ref int city, ref int area, ref string address)
        {
            if (jd_item != null)
            {
                try
                {
                    string jd_pro = !string.IsNullOrWhiteSpace(jd_item.storeProvince) ? jd_item.storeProvince.Replace("省", "") : "unknow";
                    string jd_city = !string.IsNullOrWhiteSpace(jd_item.storeCity) ? jd_item.storeCity.Replace("市", "") : "unknow";
                    string jd_area = !string.IsNullOrWhiteSpace(jd_item.storeDistrict) ? jd_item.storeDistrict.Replace("区", "") : "unknow";
                    address = jd_item.storeAddress;
                    var pro_result = _face.get_area.Where(s => s.name.Contains(jd_pro)).FirstOrDefault();
                    if (pro_result != null)
                    {
                        pro = pro_result.code;
                        var city_result = pro_result.areaList.Any() ? pro_result.areaList.Where(s => s.name.Contains(jd_city)).FirstOrDefault() : null;
                        if (city_result != null)
                        {
                            city = city_result.code;
                            var area_result = city_result.areaList.Any() ? city_result.areaList.Where(s => s.name.Contains(jd_area)).FirstOrDefault() : null;
                            if (area_result != null)
                            {
                                area = area_result.code;
                            }
                            else
                            {
                                area = city_result.areaList.FirstOrDefault().code;
                                address = $"{pro_result.name}{city_result.name}{city_result.areaList.FirstOrDefault().name}";
                            }
                        }
                        else
                        {
                            city = pro_result.areaList.FirstOrDefault().code;
                            area = pro_result.areaList.FirstOrDefault().areaList.FirstOrDefault().code;
                            address = $"{pro_result.name}{pro_result.areaList.FirstOrDefault().name}{pro_result.areaList.FirstOrDefault().areaList.FirstOrDefault().name}";
                        }
                    }
                    else
                    {
                        pro = 120000;
                        city = 120100;
                        area = 120111;
                        address = "天津市华苑产业区（环外）海泰发展三道3号A座5层";
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else
            {
                pro = 120000;
                city = 120100;
                area = 120111;
                address = "天津市华苑产业区（环外）海泰发展三道3号A座5层";
            }
        }
        public class check_aliface_item
        {
            public string mchid { get; set; }

            public string BaseUserId { get; set; }
        }

        public class OLDJdmerchantBase
        {
 
            public string blicUrla { get; set; }// 营业执照照片  MultipartFile 是   企业和个体工商户传营业执照照片，自然人传租赁合同照片
 
            public string occUrla { get; set; }//银行开户许可证图片   MultipartFile 否   企业商户必传。即（entity中企业类型companyType=企业-E）必传。个体工商户结算给对公账户时必传（entity中企业类型companyType=个体工商户-P，且结算户公私标识priatePublic=1对公）必传）
 
            public string blicObaUrla { get; set; }//税字号图片   MultipartFile 否   企业商户使用普通五证类营业执照必传，即entity中企业类型companyType=企业-E，且商户证件类型为blicCardType=BLI时必传
 
            public string blicTrcUrla { get; set; }//组织机构代码证图片   MultipartFile 否   企业商户使用普通五证类营业执照必传，即entity中企业类型companyType=企业-E，且商户证件类型为blicCardType=BLI时必传
 
            public string lepUrla { get; set; }//法人身份证信息正面图片 MultipartFile 是   必传
 
            public string lepUrlb { get; set; }//法人身份证信息背面图片 MultipartFile 是   必传
             
            public string lepUrlc { get; set; }//手持法人身份证照片   MultipartFile 否   自然人必传，即entity中的公司性质为companyType=N时必传
  
            public string img { get; set; }//经营门店门头照片    MultipartFile 是	
 
            public string enterimg { get; set; }//经营门店出入口照片   MultipartFile 是	
 
            public string innerimg { get; set; }//经营门店店内照片    MultipartFile 是	
             
            public string cardPhoto { get; set; }//结算银行卡正面照图片  MultipartFile 是   即entity中的结算户公私标识为priatePublic=0时必传，或priatePublic=3时必传
            public string settleManPhotoFront { get; set; }//结算人身份证正面照   MultipartFile 否   结算给非法人账户必传，即entity中的结算户公私标识为priatePublic=3时必传
            public string settleManPhotoBack { get; set; }//结算人身份证背面照   MultipartFile 否   结算给非法人账户必传，即entity中的结算户公私标识为priatePublic=3时必传
            public string settleProtocol { get; set; }//结算账户指定书图片   MultipartFile 否   结算给非法人账户必传，即entity中的结算户公私标识为priatePublic=3时必传

 
            public string settleHoldingIDCard { get; set; }// 
                                  //结算人手持身份证    MultipartFile 否   结算给非法人账户必传，即entity中的结算户公私标识为priatePublic=3时必传 
            public string settleHoldingBankCard { get; set; }//结算人手持银行卡    MultipartFile 否   开通POS产品且结算给非法人账户必传，即entity中的结算户公私标识为priatePublic=3且productId=404时必传

 
            public string companyType { get; set; }
            //公司性质    String（1）	是 企业-E，个体工商户-P，自然人-N。
            //可参考3.1.1.2 企业，3.1.1.3个体工商户，3.1.1.4自然人，查看不同公司性质的必传参数

       
            public string serialNo { get; set; }//请求流水号   String（64）	是 请求唯一标识。（当商户修改入驻信息时，需要传首次入驻成功时的请求流水号）

          
            public string agentNo { get; set; }//服务商商户号  String（32）	是 例：110770481

       
            public string regEmail { get; set; }//注册邮箱    String（64）	是 一个商户的唯一标识。（入驻成功的商户，注册邮箱唯一，并且不可以修改）

    
            public string regPhone { get; set; }//注册手机号   String（16）	是 注册手机号
             
            public string blicCardType { get; set; }//商户证件类型  String（3）	是 企业包含：统一社会信用代码类-USC，普通五证类-BLI，多证合一类-OCI；
                                                    //个体工商户包含：统一社会信用代码类-USC，普通营业执照-BLI //自然人：身份证-ID；
     
            public string blicCompanyName { get; set; }//商户实体名称  String（40）	是 companyType = E / P时填商户实体名称，例如北京某有限公司；
                                                       //companyType=N时填姓名+（自然人），例如：张三（自然人）。参数长度为5-40个字符


     
            public string abMerchantName { get; set; }//商户简称    String（15）	是 收银台收款方名称，必传，参数长度2-15个字符

     
            public string blicUscc { get; set; }//统一社会信用代码    String（32）	否 企业/个体工商户必传。（统一社会信用代码：一组长度为18位的用于法人和其他组织身份识别的代码）。若统一社会信用代码为15位，商户证件类型blicCardType传普通五证类-BLI。

     
            public string blicObaCardNo { get; set; }//税务登记号   String（50）	否 企业商户使用普通五证类营业执照必传，即entity中的商户证件类型为blicCardType=BLI时必传

      
            public string blicTrcCardNo { get; set; }//组织机构代码  String（32）	否 企业商户使用普通五证类营业执照必传，即entity中的商户证件类型为blicCardType=BLI时必传

          
            public string blicScope { get; set; }//经营范围    String（1000）	否 企业/个体工商户必传，即entity中公司性质blicCardType为（企业-E，个体工商户-P）


 
            public string indTwoCode { get; set; }//行业编码    String（32）	是 必传，可参考5.1行业编码

          
            public string blicProvince { get; set; }//营业地址所在省 String（32）	是 企业/个体工商户必传，例如：山东；自然人若无营业执照则填入联系人所在省，市，区，详细地址。可参考见行政区编码表
             
            public string blicCity { get; set; }//营业地址所在市 String（32）	是 企业/个体工商户必传，例如：青岛；自然人若无营业执照则填入联系人所在省，市，区，详细地址。可参考见行政区编码表
             
            public string blicDistrict { get; set; }//营业地址所在区 String（32）	是 企业/个体工商户必传，例如：青岛；自然人若无营业执照则填入联系人所在省，市，区，详细地址。可参考见行政区编码表



  
            public string blicAddress { get; set; }//营业详细地址  String（128）	是 企业/个体工商户必传；自然人若无营业执照则填入联系人所在省，市，区详细地址。
                                                   ///可参考见行政区编码表
                                 ///
            public string blicLongTerm { get; set; }//营业证件到期日是否为长期    String（8）	是 true为长期，false不是长期，自然人按身份证件填写

      
            public string blicValidityStart { get; set; }//营业证件起始日 String（32）	是 日期格式yyyy-mm-dd，自然人按身份证件填写

    
            public string blicValidityEnd { get; set; }//营业证件到期日 String（32）	是 长期直接写长期 ，不是写日期格式yyyy-mm-dd，自然人按身份证件填写

    
            public string lepCardType { get; set; }//法人证件类型  String（8）	是 身份证-ID，护照-PAS，台胞证-PASTW，港澳居民来往通行证-PASHK【若商户类型为自然人，则法人证件类型必须为身份证-ID】
        
            public string lepName { get; set; }//法人证件中姓名 String（32）	是 若商户类型为自然人即companyType = N时，则法人姓名填商户姓名

     
            public string lepCardNo { get; set; }//法人证件中号码 String（50）	是 若商户类型为自然人，即companyType=N时，则填商户身份证号

   
            public string lepLongTerm { get; set; }//法人证件到期日是否为长期    String（8）	是 true为长期，false不是长期

       
            public string lepValidityStart { get; set; }//法人证件起始日 String（32）	是 日期格式yyyy-mm-dd
    
            public string lepValidityEnd { get; set; }//法人证件到期日 String（32）	是 长期直接写长期 ，不是写日期格式yyyy-mm-dd

    
            public string contactName { get; set; }//联系人姓名   String（64）	是 必传

     
            public string contactPhone { get; set; }//联系人手机号码 String（16）	是 必传

        
            public string contactEmail { get; set; }//联系人电子邮箱 String（64）	是 必传

     
            public string contactProvince { get; set; }//联系人省    String（64）	是 必传，例：河北省

 
            public string contactCity { get; set; }//联系人市    String（64）	是 必传，例：石家庄市
 
            public string contactDistrict { get; set; }//营业地址所在区 String（32）	是 企业/个体工商户必传，例如：青岛；自然人若无营业执照则填入联系人所在省，市，区，详细地址。可参考见行政区编码表


      
            public string contactAddress { get; set; }//联系人详细地址 String（256）	是 必传
  
            public string ifPhyStore { get; set; }//门店是否线下  boolean 是   必传，true/false

            public string storeProvince { get; set; }//门店所在省   String（64）	否 开通线下产品时必传，即ifPhyStore=true时必传。可参考见行政区编码表
            public string storeCity { get; set; }//门店所在市   String（64）	  否 开通线下产品时必传，即ifPhyStore=true时必传。可参考见行政区编码表
            public string storeAddress { get; set; }//门店详细地址  String（256）	否 开通线下产品时必传，即ifPhyStore=true时必传。可参考见行政区编码表。按照省、市、区传。
             
            public string storeDistrict { get; set; }//营业地址所在区 String（32）	是 企业/个体工商户必传，例如：青岛；自然人若无营业执照则填入联系人所在省，市，区，详细地址。可参考见行政区编码表


            ///例如：河北省石家庄市长安区中山东路39号
            /// 
            public string settleToCard { get; set; }//结算是否到卡  String（1）	是 约定固定值传1
             
            public string priatePublic { get; set; }//结算户公私标识 String（1）	是 对公1，对私0，非法人3



    
            public string bankName { get; set; }//结算银行名称  String（64）	是 必传
 
            public string subBankCode { get; set; }//结算银行支行联行号   String（128）	是 必传
 
            public string bankAccountNo { get; set; }//结算银行卡账号 String（64）	是 必传
 
            public string bankAccountName { get; set; }//结算账户名   String（64）	是 必传

      
            public string settleCardPhone { get; set; }//结算银行卡绑定手机号  String（16）	是 必传

     
            public string settlementPeriod { get; set; }//结算周期    String（8）	否 工作日结算传：T1；自然日结算：D1。 如果不传则默认为T1结算

    
            public string directoryList { get; set; }//商户授权目录  List<String> 否   授权目录的个数最多为2个。商户对接线下聚合接口中的统一下单接口：微信公众号支付时，需要传该参数。（授权目录格式要求：域名后面一定的加/。比如完整目录为https://jd.sdwd.com/brd/index.php，授权目录传https://jd.sdwd.com/）

            public string miniProgramAppId { get; set; }//小程序APPID    String（64）	否 商户在微信侧的小程序APPID。商户对接线下聚合接口中的统一下单接口：微信小程序支付时，需要传入该参数，格式比如为：wx5669****79a4e001（如传APPID值一定要真实，否则影响商户入驻审核结果）

            public string merchantNo { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。


            public string statewx { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string statealipay { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string statejd { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。

            public string statewxmsg { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string statealipaymsg { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string statejdmsg { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。


            public string desKey { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。

            public string mdKey { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。

            public string result { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string id { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 

            public string createon { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。
            public string updateon { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。 
            public string baseuserid { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。
            public string createby { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。
            public decimal rate { get; set; }//商户号	String（64）	否	入驻返回的商户号。需要修改入驻信息时必传。
        }
    } 
}
